package com.example.mq.common;

import java.io.*;

/**
 * 把消息进行 序列化 和 反序列化
 */
public class BinaryTool {

    // 把一个对象序列化为字节数组
    public static byte[] toBytes(Object object) throws IOException {

        // 这个流对象相当于一个变长字节数组
        // 就可以把 object 序列化的数据给逐渐写入到 byteArrayOutputStream 中，再统一转成 byte[]
        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            // ObjectOutputStream(byteArrayOutputStream)) 此处括号里的内容，可根据实际需求修改，如果需要 关联文件就写到文件里面
            // 如果关联 网络就写到网络，此处写入的是内存中的 字节数组
            try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                // 此处的 writeObject 就会把该对象进行序列化，生成二进制数据，就会写入到
                // objectOutputStream 中
                // 由于 objectOutputStream 又是关联到了 byteArrayOutputStream，最终结果就会写入到 byteArrayOutputStream
                objectOutputStream.writeObject(object);
            }
            // 这个操作就是把 byteArrayOutputStream 二进制数据取出来 转换成 byte[]
            return byteArrayOutputStream.toByteArray();
        }

    }

    // 把一个字节数组反序列化成对象
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
                // 此处的 readObject 就是从 data 这个 byte[] 中读取数据并进行反序列化
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}
